package cn.tedu.charging.order.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
@Component
@ServerEndpoint("/ws/server/{userId}")
public class WebSocketServer {

    private static ConcurrentHashMap<Integer, Session> clients
            = new ConcurrentHashMap();

    /**
     * 消息到达
     * 消息从 客户端 到达 服务端
     * 类似于 MqttConsumer#messageArrived
     * @param message
     */
    @OnMessage
    public void onMessage(String message,Session session) {
        log.info("接收到客户端消息：{}", message);
    }

    /**
     * 服务端 自动向 客户端 推送 发送消息
     * @param userId
     * @param message
     */
    public void sendMessage(Integer userId,String message) {
        log.debug("服务端向客户端:{}发送消息:{}",userId,message);
        Session session = clients.get(userId);
        if (session != null) {
            session.getAsyncRemote().sendText(message);
        }else {
            log.error("客户端连接不存在");
        }
        log.debug("服务端向客户端:{}发送消息:{},成功",userId,message);
    }

    /**
     * 客户端 和 服务端 建立连接
     * 类似于 MqttConsumer#connectComplete
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") Integer userId) {
        log.info("客户端连接成功:{}",userId);
        clients.put(userId,session);
    }

    /**
     * 出现错误
     * @param throwable
     */
    @OnError
    public void onError(Throwable throwable) {
        log.error("客户端连接异常",throwable);
    }

    /**
     * 客户端和服务端断开连接
     */
    @OnClose
    public void onClose(Session session, @PathParam("userId") Integer userId) {
        log.info("客户端连接关闭:{}",userId);
        clients.remove(userId);
    }

}
